window.onload = function(){
    // var name = 'sonia';
    // function fun(name:string):void{
    //     console.log('hello '+name)
    //     // return name;
    // }
    // fun(name)


    // // 对于可复用的方法 要兼容更多的类型
    // function  fun2(name:any):any{
    //     console.log('hello '+name)
    //     return name;
    // }
    // fun2('123');

    // // 泛型  T 泛型变量表示任意类型
    // function  fun3<T>(name:T):T{  
    //     console.log('hello '+name)
    //     return name;
    // }
    // fun3<number>(123);
    // fun3<number | string>(123); //T 可以表示多个类型
    // // 类型推断 编译器会根据参数自动推断为类型
    // fun3(456); 
    // // 函数声明 函数定义
    // function fun5<T>(name:T):T{
    //     return name;
    // }
    // // 函数表达式
    // let fun6 = function<A>(name:A):A{
    //     return name;
    // }

    // // ES6 
    // let fun7 = <T>(name:T):T=>name;
    // let fun8 = <T>(name:T):T=>name;
    // fun8<Object>('1')

    //接口在函数中的运用
    function f1(name:{name:string}):void{
        console.log(name)
    }
    f1({name:'abc'})

    // 接口
    interface ObjName{
        name:string;
    }
    function f2(name:ObjName):void{
        console.log(name)
    }
    f2({name:'123'})
    
    interface Search{
        (a:string,b:string):boolean
    }
    // JS传入两个参数 匹配第二个参数是否匹配第一个参数的内容
    let f3:Search = function(str1:string,str2:string):boolean{
        console.log(str1)
        let index = str1.indexOf(str2);
        return index!=-1;
    }
    console.log(f3('http://123.com','c'))

    interface Search2{
        <T>(a:T,b:T):boolean;
        // <T>(str:T,st2:string):number;
    }
    let f4:Search2 = function<T>(str1:T,str2:T):boolean{
        console.log(str1)
        return str1 == str2;
    }
    console.log(f4<number>(4,4))

    
    interface LengthNum{
        length:number;
        toString():void;
    }
    // 约束泛型 泛型符合接口的形状
    function f5<T extends LengthNum>(name:T):T{
        return name;
    }
    f5<LengthNum>('123');

    // 泛型在类中的运用
    class A2<T>{
        n:T;
        constructor(num:T){
            this.n = num;
        }
        action(x:string){
            return ;
        }
    }
    var a2 = new A2<string>('2')
    a2.action('2')

    // 枚举 对数据类型的一个补充


}